<!DOCTYPE html>
<html lang="en-us">

<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />

  	<meta property="og:title" content=" 我的博客 &middot;  我的博客" />
  	<meta property="og:site_name" content="我的博客" />
  	<meta property="og:url" content="/my_technology/" />
    
    
    <meta property="og:type" content="website" />
    

  <title>
     我的博客 &middot;  我的博客
  </title>

    <meta name="description" content="这里是付佳康的个人博客" />

    <meta name="HandheldFriendly" content="True" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />

    <link rel="shortcut icon" href="/my_technology/images/favicon.ico">
	  <link rel="apple-touch-icon" href="/my_technology/images/apple-touch-icon.png" />
    
    <link rel="stylesheet" type="text/css" href="/my_technology/css/screen.css" />
    <link rel="stylesheet" type="text/css" href="//fonts.googleapis.com/css?family=Merriweather:300,700,700italic,300italic|Open+Sans:700,400|Inconsolata" />


    
      
          <link href="/my_technology/index.xml" rel="alternate" type="application/rss+xml" title="我的博客" />
      
      
        <link href="/my_technology/index.xml" rel="alternate" type="application/rss+xml" title="我的博客 &middot; 我的博客" />
      
    
    <meta name="generator" content="Hugo 0.68.3" />

    <link rel="canonical" href="/my_technology/" />

     
</head>
<body class="nav-closed">
<div id="particles-js"></div>
  


 <div class="site-wrapper">



<header class="main-header " style="background-image: url(/my_technology/images/user.jpg)">


    

    <nav class="main-nav overlay clearfix">
        
            <a class="blog-logo" href="/my_technology/"><img src="/my_technology/images/user.png" alt="Blog Logo" /></a>
        
        
    </nav>
<div class="vertical">
        <div class="main-header-content inner">
            <h1 class="page-title">
              <a class="btn-bootstrap-2 title-scroll" href="#content">我的博客</a>
          </h1>
          <h2 class="page-description">这里是付佳康的个人博客</h2>
        </div>
</div>
    <a class="scroll-down icon-arrow-left" href="#content"><span class="hidden">Scroll Down</span></a>
</header>

<main id="content" class="content" role="main">
    
    
    
    
    
    

    <div class="extra-pagination inner">
        <nav class="pagination" role="navigation">
	
	<span class="page-number">Page 1 of 3</span>
	
	    <a class="older-posts" href="/my_technology/page/2/">Older Posts &rarr;</a>
	
</nav>

    </div>

    
        
<article class="post ">
    <header class="post-header">
        <h2 class="post-title"><a href="/my_technology/19/">总结一</a></h2>
    </header>
    <section class="post-excerpt">
      <p>
          <section class="post-content">
            <pre><code>一、测试用例:
    测试用例的定义：
        执行测试的依据，将测试的操作步骤进行以文档的方式记录下来
        
    测试用例的格式：
        测试用例的模块: 操作软件的一个大的菜单   命名以模块名称为主
        测试用例的编号: 命名以菜单下具体功能——数字   
        测试输入: 对具体的功能操作步骤   
        执行条件: 操作的先决条件
        预期结果: 是以需求文档上的内容为准
        实际结果: 依据测试数据的内容输出后得到的结果可能与预期一直或是不一致
        
    测试用例的文档方式2种:
        exl 表格的方式
        word文档方式

    测试用例的特性:
        代表性：能够代表并覆盖各种合理的和不合理、合法的和不合法的、边界的和越界的以及极限的输入数据、操作等。
        针对性：对程序中的可能存在的错误有针对性地测试
        可判定性：测试执行结果的正确性是可判定的，每一个测试用例都应有相应的期望结果
        可重现性：对同样的测试用例，系统的执行结果应当是相同的。

    测试方法策略：
        1.等价值划分： 分为有效（输入的集合，在这个集合中每个条件都是有效）与无效（输入的集合，在这个集合中每个条件都是无效）
        2.边界值： 根据边界条件、次边界条件、空值和无效数据进行等价类划分，合理减少测试用例，选取正好等于、刚刚大于或刚刚小于边界值作为测试数据
        3.因果图法： 因果图法比较适合输入条件比较多的情况，测试所有的输入条件的排列组合。所谓的原因就是输入，所谓的结果就是输出
        4.正交法： 利用排列整齐的表 -正交表来对试验进行整体设计、综合比较、统计分析，实现通过少数的实验次数找到较好的生产条件
        5.场景法： 用事件触发来控制流程的，事件触发时的情景便形成了场景，而同一事件不同的触发顺序和处理结果就形成事件流。可以比较生动地描绘出事件触发时的情景，有利于测试设计者设计测试用例，同时使测试用例更容易理解和执
        6.错误推断法： 错误猜测法是测试经验丰富的人喜欢使用的一种测试用例设计方法。一般这种方法是基于经验和直觉推测程序中可能发送的各种错误，有针对性地设计。只能作为一种补充
        
    编写任意测试用例的三步骤：
        1.根据需求提取测试用例的测试点
        2.根据测试点内容输入不同数据类型
        3.得到不用结果用来编写测试用例
        

二、缺陷报告：
    软件缺陷的定义：
        软件缺陷，常常又被叫做Bug，从产品内部看，缺陷是软件产品开发或维护过程中存在的错误、毛病等各种问题；
        从产品外部看，缺陷是系统所需要实现的某种功能的失效或违背。
        
    软件缺陷的种类划分:
        1、功能不正常
        2、软件在使用上感觉不方便
        3、软件的结构未做良好规划
        4、提供的功能不充分
        5、与软件操作者的互动不良
        6、使用性能不佳
        7、为做好错误处理
        8、边界错误
        9、计算错误
        10、使用一段时间所产生的错误
        11、控制流程的错误
        12、在大数据量压力下所产生的错误
        13、在不同硬件环境下产生的错误
        14、版本控制不良导致的错误
        15、软件文档的错误
        
    软件缺陷按照严重程度分为五种：
        1.系统崩溃
        2.严重
        3.一般
        4.次要
        5.建议
        
    软件缺陷按照优先级分为三种，修正由高到低：
        1.高
        2.中
        3.低
        
    软件缺陷按照Bug分为六级：
        1级，系统崩溃：
            定义：严重阻碍测试和开发工作
            对应优先级：最高
            具体可分为：
                1.功能完全没有实现
                2.应用闪退/崩溃无法运行
                3.应用必现安全模式，无法运行
                4.其他导致功能无法测试的问题
                
        2级，至关重要：
            定义：非阻碍用例执行的严重问题
            对应优先级：高
            具体可分为：
                1.简单操作应用闪退/崩溃，卡死
                2.数据丢失
                3.严重影响系统，自身功能无法运行
                4.严重数值计算错误
                5.数据库损坏或无法保存配置
                6.安全性问题（包括数据加密等）
        
        3级，主要：
            定义：功能存在缺陷，但不影响应用和系统的稳定性
            对应优先级：中
            具体可分为：
                1.内存泄露（长时间不用的对象需要被回收，不被回收占内存）
                2.功能实现逻辑覆盖不全面
                3.非必现，但复现概率超过50%的闪退/崩溃和安全模式
                
        4级，一般：
            定义：对应用熟悉度高才能感知到的问题，对应用基本功能实现无影响
            对应优先级：中
            具体可分为：
            1.轻微数值计算错误
            2.功能实现有误，与产品文档不完全贴切
            3.用户简单操作，即可明显感知的UI问题
                
        5级，较小：
            定义：界面，性能缺陷
            对应优先级：低
            具体可分为：
                1.操作界面错误（提示显示规则，刷新规则是否与文档一致）
                2.边界条件显示错误  　 　 　
                3.提示信息和界面效果展示错误（包括未给出信息、信息提示错误等） 
                4.复现率低于5%的闪退/崩溃和安全模式  　 　 　
                5.插件兼容和性能未优化问题  　 　 　
                6.非正常操作导致UI显示异常
                
        6级，建议：
            定义：对于产品的意见或者建议
            对应优先级：低
            具体可分为：
                1.对于产品设计方面的意见和建议
                2.对于产品界面优化方面的意见和建议
                3.对于产品需要优化增强用户体验方面的意见和建议 
                         
    软件缺陷按照测试种类6分：
        逻辑功能类
        性能类
        界面类
        易用性类
        安装
        兼容性类

    软件缺陷类型：
        系统缺陷：
            1、程序死循环
            2 程序错误，不能执行正常工作或重要功能，使系统崩溃或资源不足
            
        数据缺陷：
            1 数据计算错误
            2 数据约束错误
            3 数据输入、输出错误
            
        数据库缺陷：
            1 数据库发生死锁
            2 数据库的表、缺省值未加约束条件
            3 数据库连接错误
            4 数据库的表有过多的空字
        
        接口缺陷：
            1 数据通信错误
            2 程序接口错误
            
        功能缺陷：
            1 功能无法实现 
            2 功能实现错误
        
        安全性缺陷：
            1 用户权限无法实现
            2 超出限制错误
            3 访问控制错误
            4 加密错误
        
        兼容性缺陷：
            与需求规定配置兼容性不配合
            
        性能缺陷：
            1 未达到预期的性能目标
            2 性能测试中出错，导致无法进行测试
            
        界面缺陷：
            1 操作界面错误
            2 打印内容，格式错误
            3 删除操作未给出提示
            4 长时间操作未给出提示
            5 界面不规范
            
        建议（建议性的改进）：
            1 功能建议
            2 操作建议
        
       
    对BUG解决方案的七种描述：
        无效的Bug：
            By Design （说明：设计需求就是这样设计）
            Duplicate (说明：这个问题别人已经发现)
            Not Repro (说明：无法修复的问题)
        
        有效的Bug：
            Fixed (说明：问题被修复)
            External （说明：外部造成的原因，如浏览器、操作系统）
            Postponed （说明：发现的太晚，下一版本讨论是否解决）
            Won’t Fix （说明：是个问题，但不值得修复）
        
    
    Bug的生命周期：
        新建:
            测试员发现Bug并提交，我们将状态标注为新建
            
        确认：
            开发人员接受该Bug，将Bug状态修改为已分配（Assigned），表示已经认可并确认
            
        解决：
            开发人员解决Bug后，将Bug状态修改为解决，并发送给色是人员回归测试
            
        重新验证：
            测试人员对Bug进行回归测试
            
        关闭：
            测试人员确认解决Bug后，将Bug的状态修改为关闭，否则发送给开发人员重新修改
            
        重新打开：
            旧版本关闭的Bug再新版本重新出现，测试人员需要将其状态修改为重新打开

    缺陷报告的组成：
        缺陷编号
        测试用例编号
        缺陷描述
        复现缺陷步骤
        缺陷等级
        测试人
        指派人
        缺陷状态
    
三、Charles功能：
    1.进行http和https网络封包（抓包）
    2.Charles断点请求：
        设置断点流程：
            1.右键点击要进行断点操作的地址，点击Breakpoints
            2.在Proxy（代理）中点击Breakpoints Settings可进行设置
    3.支持和重发网络请求：
        重复网络请求的目的：
            后台调试过程中，一直在客户端实现点点点过于麻烦
            直接使用charles的重发网络的方式可以直接多次调用接口发送请求，方便查询结果
            重发网络的方式：
                1.右键点击连接，点击repeat 的方式进行单次的网络请求
                1.右键点击连接，点击Repeat Advanced 或 在Tools下点击Advanced Repeat进入下图定义，进行多次网络请求
    4.支持修改网络参数：    
        先进行断点操作
        在Breakpoints Settings中进入断点修改Query（参数：* 代表所有）
    5.支持网络请求并修改参数值：
        进行断点操作
        刷新进入
        在Breakpoints中出现连接，Edit Request中可修改请求
    6.支持弱网测试：
        在代理（proxy）里找 Throttle Settings设置
            Enable Throttling：你要选择弱网测试吗
            Only for selected hosts：你要选择本机进行弱网测试吗
            location 中添加测试网址：
                protocol：选择请求协议
                Host：输入进行测试的网址
                Port：输入端口号 （* 代表所有）
            
                
            
    
    
        
    
</code></pre>
          </section>
      </p>
      
    </section>
    <footer class="post-meta">
        
            <img class="author-thumb" src="/my_technology/images/user.png" alt="Author image" nopin="nopin" />
        
        
            付佳康
        
        
        <time class="post-date" datetime="2020-06-22T15:41:05&#43;08:00">
            22 Jun 2020
        </time>
    </footer>
</article>

    
        
<article class="post ">
    <header class="post-header">
        <h2 class="post-title"><a href="/my_technology/18/">python文件操作与异常处理</a></h2>
    </header>
    <section class="post-excerpt">
      <p>
          <section class="post-content">
            <pre><code>1.文件的打开与关闭
    f = open('文件名', '模式（w:写入、r：读取、a：追加）')
    f.close() 关闭
    
2.文件的读
    f = open(&quot;文件名&quot;, &quot;r&quot;)  以只读模式’r’打开文件,文件不存在，报错。
    a = f.read()  read:读全部内容，得到字符串
    b = f.readline()  readline:一次读一行内容，得到字符串
    c = f.readlines()  readlines：读全部内容，得到包含每行内容的列表
    print(a,b,c)
    
3.文件的写
    f = open(&quot;文件名&quot;, &quot;w&quot;)  以只写&quot;w&quot;模式打开文件，文件不存在，创建新文件，文件存在，清空原有内容
    f = open(&quot;文件名&quot;, &quot;a&quot;)  以追加&quot;a&quot;模式打开文件，文件不存在，创建新文件，文件存在，在原有内容末尾添加新内容
    f.write(&quot;hello world\n&quot;)  write:将字符串写入文件内容，想换行，手动写入&quot;\n&quot;

4.文件的拷贝
    先读取txt.py中所有内容
        f = open(&quot;文件名&quot;, &quot;r&quot;)
        s = f.read() s中就是文件所有内容
        f.close()  
    将读取的内容写入2.txt
        f = open(&quot;2.txt&quot;, &quot;w&quot;)
        f.write(s)  将s中的内容写入2.txt中
        f.close()
        
5.File对象的属性
    一个文件被打开后，使用对象进行接收，接收的对象即为 File 对象
        file.closed: 返回true如果文件已被关闭，否则返回false。
        file.mode: 返回被打开文件的访问模式。
        file.name: 返回文件的名称。
        file.softspace: 如果用print输出后，必须跟一个空格符，则返回false。否则返回true。（python3已经去除。）
    
    例：
        f = open(&quot;txt1.py&quot;,&quot;r&quot;)
        查看文件名
        print(&quot;文件名&quot;,f.name) 
        查看是否已经关闭 是:True 否:False
        print(&quot;是否已关闭&quot;,f.closed)
        查看访问模式
        print(&quot;访问模式:&quot;,f.mode)
        关闭一下，查看是否已经关闭
        f.close()
        print(f.closed)
        
6.文件相关操作
    import os   导入os包
    将文件重命名
    os.rename(&quot;1.txt.py&quot;, &quot;txt3.py&quot;)
    
    删除文件
    os.remove(&quot;txt1.py&quot;)
    
    新建文件夹
    os.mkdir(&quot;5.txt&quot;)
    
    删除文件夹
    os.rmkdir(&quot;5.txt&quot;)
    
    获取当前文件所在的路径
    r = os.getcwd()
    print(r)

7.异常处理
    1.导致程序在运行过程中出现非正常终端和退出的错误，称为异常。大多数的异常都不会被程序处理，而是以错误的形式展现出来。

    2.异常有很多类型，Python 内置了几十种常见的异常，无需特别导入，直接就可以用。所有异常都是异常类，首字母是大写的。
    
    3. Python内置了一套try..except...finally(else) ... 的异常处理机制，来帮助我们处理异常
        语法：
        Try:
        代码块
        except Exception as e:
        代码块
    
    一、异常的常见用法
    1、try...except..  捕获单个异常
        * 可能产生的错误放在try 中
        * 产生错误后要做的处理放在except中
    
    2、捕获多个异常
        多个异常之间用逗号隔开
    
    3、获取异常的信息描述
        使用关键字 as
    
    4、捕获所有异常
        except exception as e
    
    5、Else
        如果没有捕获到异常，则运行else从句中的代码
    
    6、try..finally
        在程序中，如果一段代码是否产生异常都必须要执行，那么这时就需要使用finally。比如关闭文件，释放锁，关闭数据，关闭数据库连接等
</code></pre>
          </section>
      </p>
      
    </section>
    <footer class="post-meta">
        
            <img class="author-thumb" src="/my_technology/images/user.png" alt="Author image" nopin="nopin" />
        
        
            付佳康
        
        
        <time class="post-date" datetime="2020-06-21T18:55:23&#43;08:00">
            21 Jun 2020
        </time>
    </footer>
</article>

    
        
<article class="post ">
    <header class="post-header">
        <h2 class="post-title"><a href="/my_technology/16/">python基础</a></h2>
    </header>
    <section class="post-excerpt">
      <p>
          <section class="post-content">
            <pre><code>什么是python

常识
    龟叔 1991  python2.0  python3.0
    人生苦短，我用python

python优点
    简单易学 、免费开源、丰富的库、可扩展性、可移植性、面向对象、规范的代码。。。
    缺点：执行效率相对慢

python应用场景
    Web开发，自动化脚本，爬虫，科学计算。。

注释
    #单行注释
    多行注释&quot;&quot;&quot; &quot;&quot;&quot;

变量
    用来存储数据
    A=123

变量的类型
    数字-int、float
    布尔-True、False
    字符串 str
    列表 list
    Tuple 元组
    Dict  字典

    变量类型的查看type()

标识符：
    构成：
        字母、数字、下划线
    a b 不能作位标识符
    Abc 不等于 abc
    
命名规则：
    三大命名规则：
        大驼峰 Abcd
        小驼峰 abCd
        下划线 a_bcd
    不能以其它字符命名
    
关键字：
    定义：特殊的标识符，关键字不可用来当作变量名
    如何在Python查看关键字：
        windows+R打开命令行
        &gt;&gt;&gt; python
        &gt;&gt;&gt; import keyword
        &gt;&gt;&gt; keyword.kwlist
        出现关键字：['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

输入：
    Python2.0: raw_input() 将字符串与int类型分开
    Python3.0: input() 结果为字符串
     
输出：
    格式：print()
    格式化输出：print(&quot;%s, %d&quot; % （变量名1，变量名2）) 
    
常用的格式符号：
    %s -- 字符串
    %d -- 十进制整数(int类型)
    %f -- 浮点
    %c -- 字符
    
输出的换行：
    \n
    
运算符：
    +、-、*、/ --&gt; 加减乘除
    // --&gt; 取整（3//2==1）
    % 取余
    ** 幂 
    优先级 先幂再乘除最后加减
    
赋值运算符：
    =
    当个变量赋值 a=123
    多个变量赋值 a,b,c=1,2,3
    
符合赋值运算符：
    +=、-=、*=、/=、//=
    
python常用的数据类型转换：
    int()数字整形类型
    float()浮点类型
    str（）字符串类型
    list（）列表类型
    tuple（）
    
if—elif-else判断：
    格式：
        if 判断条件：
            条件成立输出结果
        elif 判断条件2：
            条件2成立输出结果
        else：
            条件不成立输出结果
            
比较运算符：
    ==、!=、&gt;=、&lt;=、&gt;、&lt;
    
逻辑运算符(或、且、非):
    and 且
    or 或
    not 非
    
if嵌套：
    格式：
        if 判断条件：
            if 判断条件2：
                成立返回结果
        else：
            不成立返回结果

while循环使用场景：
    while 与 if语法相似
    区别是if条件成立，执行一次，while条件成立，重复执行
    实例：
        a = 0  变量为0
        while a &lt; 10:  a小于10执行
            a += 1 每次循环a=a+1
            print(a) 输出结果

while嵌套应用场景：
    正倒三角形、九九乘法表
    三角实例：
        i = 1
        while i &lt;= 5:
            j = 1
            while j &lt;= i:
                print(&quot;*&quot;, end='')  end加距离
                j += 1
            print(&quot;\n&quot;)  \n换行
            i += 1
    
    乘法表实例：
        i = 1
        while i &lt;= 9:
            j = 1
            while j &lt;= i:
                print('%d*%d=%d'% (j, i, j*i), end=' ')
                j += 1
            print('\n')
            i += 1
                      
for循环：
    break终止循环
    continue跳过当前，进行下一次循环
    
    for循环三角实例：
        for i in range(1, 10):
            for j in range(1, i):
                print('*', end='')
                j += 1
            print('\n')
            i += 1    
            
    for循环九九乘法表：
        for i in range(1, 10):
            for j in range(1, i+1):
                print('%d*%d=%d' % (j,i,j*i), end=' ')
                j += 1
            print('\n')
            i += 1
            
字符串介绍：
    格式：变量名=&quot;&quot;
    输出：print(&quot;内容&quot;)
    格式化输出print('%s,%d' % (str, int))
    输入：input（）结果为字符串类型
    
字符串下标和切片：
    下标--索引，从0开始
    切片：对操作的对象截取一部分（字符串，列表，元组）
    格式：
        [起始值:结束：步长]  包头不包尾 步长表示间隔几位取值，步长若为符，字符串为倒序排列
    
字符串常见操作：
    find与rfind：
        find方法：从左检测是否包含内容，如包含返回第一个匹配的索引，不包含返回-1
        rfind方法：从右检测是否包含内容，如包含返回第一个匹配的索引，不包含返回-1
    
    index与rindex
        用法跟find差不多，只不过：如果匹配不到则报错
        
    count 在返回mystr（start~end之间，出现的次数）
        如果存在则返回出现次数，如果不存在不会报错而是返回0
        
    replace替换
        用来将字符替换
        
    split
        以...分割,通过split可以对字符串进行列表的转换
        
    capitalize
        把字符串第一个字母大写
    
    title 
        把字符串每个单词的首字母大写
    
    endswith 
        判断是否以XXX结尾，结果为布尔（True，Flase）
    
    lower 
        将所有的大写转为小写
        
    upper 
        将所有的小写转为大写
        
    ljust
        左对齐 空格填补
        
    rjust
        右对齐 空格补齐
        
    center 
        居中对齐 空格补齐
    
    lstrip 
        删除左边空格
    
    rstrip
        删除右边空格
    
    strip
        用于移除字符串头尾指定的字符（默认为空格或换行符）或字符序列
        该方法只能删除开头或是结尾的字符，不能删除中间部分的字符
    
    partition
        用来根据指定的分隔符将字符串进行分割,返回元组
        
    rpartition
        类似于 partition() 方法，只是该方法是从目标字符串的末尾也就是右边开始搜索分割符
        
    splitlines
        按行进行分割，注意返回的是列表
    
    isalpha
        判断字符串中是否有字母，是True反之false，判断--布尔--返回结果（True，False）
   
   isdigit
        判断字符串中是否有数字，是True反之~False
        
    isalnum 
        判断字符串中是否有数字或者字母，是True反之False
        
    isspace
        判断字符串中是否有空格，是True反之False
        
    join 
        拼接（常用）通常与split联动
        
列表的循环遍历：
    For i in 
    List = [1,2,3,4,5]
    For i in list:
        Print(i)
    
    while也可用
        
列表的相关操作
增删改查
    增：append extend insert
        Append 默认添加到列表尾部
        Extend 添加到列表尾部
        insert通过下标索引插入数据
            B = [1,2]
            B.insert(0,3) 0是下标，3是数字
    
    列表的删除 del pop remove
        Del 根据下标进行删除
        Pop 删除最后一个元素
        Remove 根据元素的值进行删除
        
    列表的修改 
        第一步：精准定位，通过下标找到要改的数据
        第二步：再修改
        B = [1,2,3]  #把1改为4
        B[0] = 4
        # B[0] = &quot;4&quot;
        print(B)
        
    列表的查询
        In   not in  index  count
        In 存在
        Not in 不存在
        Index 存在返回下标，不存在报错   b = a.index(&quot;a&quot;,1,4) a是要找的，1，4是起始位置
        Count a=[1,2,3,4,5,1]  1在列表中出现过几次
        
    列表的嵌套
        列表里面再放一个列表
            A = [['1,2,3'],[“1,5”]]
            
元组
    访问元组
    通过下标访问
    Tuple = (“houyue”,1,1.01)
    b = Tuple[0]
    print(b)
    
    Index 存在返回下标，不存在报错   b = a.index(&quot;a&quot;,1,4) a是要找的，1，4是起始位置
    count a=[1,2,3,4,5,1]  1在列表中出现过几次
    
字典
    格式：
        Dict={“Key键”:”value值”}
        print(dict[&quot;键&quot;]) 如果未找到键则会报错
        print(dict.get(&quot;键&quot;)) 通过get找就算未找到也不会报错，返None
       
   字典常见操作:
        查看元素:除了用键（key）查找数据以外还可以用get来查找
        修改元素:每个元素都可以修改，只要找到key，就可以肆无忌惮了 a = dict[&quot;键&quot;]=&quot;更改的值&quot;
        字典的添加：直接添加一个键--值， Dict[“键”]=值
        
    字典的删除:
        Del
        Clear()
        Pop
      
        Del 指定删除元素  ---（扩展pop用法类似）
            Del dict[“name”]
            Print()
        Del 删除整个字典
            Del dict
        
        Clear()清空字典
            Dict.clear()
        
    字典的相关操作:
        len()
            a = len(dict)
            测量字典中，键值对的个数  
            count()在字典中没法用
            
        keys
            a = dict.keys()
            返回一个包含字典中所有key的列表 

        values
            a = dict.values()
            返回一个包含字典中所有值的列表
        
        items
            a = dict.items()
            返回一个包含所有（键、值）元组的列表
            
    字典的遍历
        格式：for...in...可以遍历字典,遍历可用的数据类型：字符串、列表、元组，字典
        
        遍历字典的key（键）
            for key in dict.keys:
                print(key)
            
        遍历字典的value（值）
            for value in dict.values:
                print(value)
                
        遍历字典的项（元素）item
            for item in dict.items():
                print(item)
                
        遍历键值对
            for key,value in dict.items():
                print(key,value)
        
集合介绍
    Set={}
    集合是一个无序，元素是唯一，集合一般用于元组或者列表的元素的去重
    
    添加 add
    Set={1,2,4,5}
    A = Set.add(3)
    Print(A)
    
    Update 把元素拆分，作为个体传入到集合中
    Set.update(“789”)
    
    删除元素
    Remove pop discard
    Remove:删除集合中的元素，有则删，没有就报错
    Pop 随机删除集合中的元素，set中有则删，没有就报错
    Discard 删除集合中的元素，有则删，没有就不做任何操作
    
    集合最常见的用法：交集跟并集（&amp;  |）
    交集------且
    Set1={1,2,3,4}
    Set2={3,4,5,6}
    Set3 = set1 &amp; set2
    Print(set3)  
    &gt;&gt;&gt;{3,4}
    
    并集------或
    Set1={1,2,3,4}
    Set2={3,4,5,6}
    Set3 = set1 | set2
    Print(set3)  
    &gt;&gt;&gt;{1,2,3,4,5,6}
                   
</code></pre><pre><code>练习：
    # python优点
    # 简单易学 、免费开源、丰富的库、可扩展性、可移植性、面向对象、规范的代码
    
    # 变量的类型
    # 字符串，整形（浮点），布尔，列表，字典，元组
    
    # 标识符命名规则
    # 字母，数字，下划线
    
    # 如何在python中查找关键字.
    # 在命令行打开python，输入import keyword，keyword.kwlist
    # 返回结果['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
    
    # 常用的格式符号有哪些（3个即可）
    # %d--十进制整数,%s--字符串,%f--浮点
    
    # 运算符（至少5个）
    # +、-、*、/、//
    
    # python常用的数据类型转换（至少3个）
    # str(),int(),list()
    
    # 计较运算符（至少3个）
    # &lt;=、&gt;=、==
    
    # 逻辑运算符是哪3个
    # and、or、not
    
    # 自己写一个if-elif-else条件语句并输出
    # a = 1
    # if a == 1:
    #     print(1)
    # elif a == 2:
    #     print(2)
    # else:
    #     print(3)
    
    # 通过程序写一个等边三角形
    # num = int(input('请输入数字:'))
    # for i in range(num, 0, -1):  #-1倒序取值，从下标为3到0，不包括0
    #     print(i*' ' + (num+1-i)*'*' + (num-i)*'*')
    #        *
    #       ***
    #      *****
    
    # 通过程序写一个九九乘法表
    # for i in range(1, 10):
    #             for j in range(1, i+1):
    #                 print('%d*%d=%d' % (j, i, j*i), end=' ')
    #                 j += 1
    #             print('\n')
    #             i += 1
    
    # 通过代码针对str=&quot;abcdefg&quot;  :
    # s = &quot;abcdefg&quot;
    # 	1取出bcd
    # print(s[1:4])
    # 	2将str倒序
    # print(s[::-1])
    # 	3取出bdf
    # print(s[1::2])
    
    # 通过代码针对mystr = &quot;hello world python and python&quot;进行如下操作
    # mystr = &quot;hello world python and python&quot;
    # 	1.找到右边第一个p的索引
    # print(mystr.rfind('p'))
    # 	2.找z结果要求报错
    # print(mystr.index('z'))
    # 	3.将所有空格替换成逗点
    # print(mystr.replace(' ', ','))
    # 	4.通过逗点生成一个列表
    # print(mystr.split(' '))
    # 	5.将d全部替换成大写D
    # print(mystr.replace('d', 'D'))
    
    # a = [1,2,3,4,5,6]，在a中元素5前添加一个5.5元素
    # a = [1,2,3,4,5,6]
    # a.insert(4, 5.5)
    # print(a)
    
    # 	          在a中元素6后面添加&quot;我心态炸了&quot;
    # a.append('我心态炸了')
    # print(a)
    
    # 	          删除a中的元素1
    # del(a[0])
    # print(a)
    
    # b = [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,&quot;b&quot;,&quot;a&quot;] 查找索引区间在2-4的“b”的索引
    # b = [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,&quot;b&quot;,&quot;a&quot;]
    # 		    查找索引区间在3-5的“a”的索引
    # a = b.index('a', 3, 5)
    # print(a)
    
    # 试着修改一个自己创建的元组，达到报错的目的，提醒自己元组不可修改
    # t = ('asd', 1, 2)
    
    # 自己写一个字典，
    # a = {'name': '一', 'price': '13'}
    # 计算自己写的字典中存在键值对的个数，
    # print(len(a))
    # 找出字典中所有的key，
    # for key in a:
    #     print(key)
    # 找出字典中所有的value，
    # for value in a.values():
    #     print(value)
    # 试着遍历字典中的item，
    # for item in a.items():
    #     print(item)
    # 最后删除字典中的第一个键所对应的数据
    # del(a['name'])
    # print(a)
    
    # 集合中的discard的概念
    # 删除集合中的元素，有则删，没有就不做任何操作
    
    # 试着自己写两个集合，分别进行 &amp; 和 | 的操作
    # a = {1, 2, 3}
    # b = {2, 3, 4}
    # c = a &amp; b
    # d = a | b
    # print(c)
    # print(d)
    
    
    
    # 如果以上觉得没挑战，思维扩展：一个学校，有3个办公室，现在有8位老师等待工位的分配，请编写程序，完成随机分配

</code></pre>
          </section>
      </p>
      
    </section>
    <footer class="post-meta">
        
            <img class="author-thumb" src="/my_technology/images/user.png" alt="Author image" nopin="nopin" />
        
        
            付佳康
        
        
        <time class="post-date" datetime="2020-06-18T08:50:14&#43;08:00">
            18 Jun 2020
        </time>
    </footer>
</article>

    
        
<article class="post ">
    <header class="post-header">
        <h2 class="post-title"><a href="/my_technology/15/">python常见字符串操作</a></h2>
    </header>
    <section class="post-excerpt">
      <p>
          <section class="post-content">
            <pre><code>sel = &quot;ch ss arrr o&quot;
sel = sel.split()  #利用split转换成列表['ch', 'ss', 'arrr', 'o']
print(sel)
long = &quot;&quot;  #创建空字符 设为最大值
for i in sel:  # i为['ch', 'ss', 'arrr', 'o']里的数值
    if len(i)&gt;len(long): #进行长度数值的比较
        long = i  #  i的最大值 添加进 long
print(long)  #输出


index() 首页/索引  （重点） 因带克斯
ret = my_str.index(&quot;o&quot;)
print(ret)

ret = my_str.index(&quot;l&quot;,0,8) # 0，8区间 含头不含尾
print(ret)

count()查找某个字符出现次数 （重点）  抗特
ret = my_str.count(&quot;l&quot;) #区分大小写
print(ret)

replace() 替换 （重点） 瑞普累思
ret = my_str.replace(&quot;h&quot;,&quot;H&quot;,1) #若不写次数默认全部替换
print(ret)

split() 切割分割  （重点） 色普利特
ret = my_str.split(&quot; &quot;)#切割空格
print(ret)

upper() 转换mystr中的小写字母为大写 （重点）  啊盆
print(my_str.upper())

lower（） 将大写转小写 （重点） 楼窝儿
print(my_str.lower())

isalpha（） 如果mystr所有字符都是字母，则为真，否则假 （重点） 意思次普拉
ret = my_str.isalpha()  #空格也算字符
print(ret)

isdigit（） 判断是都都是数字  （重点）  意思迪G特
ret =my_str.isdigit()
print(ret)

isalnum()  如果mystr所有字符都是字母或数字则返回TRUE（真）否则假  （重点） 意思IO奶母
ret = my_str.isalnum()
print(ret)

isspace  如果mystr中《只》包含空格，则返回True，否则False  （重点） 意思思配词
ret = my_str.isspace()
print(ret)

rfind() 类似于find（）函数，不过是从右开始查找
print(my_str.find(&quot;l&quot;))  #2
print(my_str.rfind(&quot;l&quot;))   #5

capitalize()  把字符串第一个字符大写
my_str = &quot;i am a student&quot;
ret = my_str.capitalize()
print(ret)

partition() 将字符转换三部分，str前，str和str后  从左开始查找
my_str = &quot;i am a student&quot;
print(my_str.partition(&quot;am&quot;))

rpartition（） 将字符转换三部分，str前，str和str后  从右开始查找
my_str = &quot;i am a student&quot;
ret = my_str.rpartition(&quot;a&quot;)
print(ret)

splitlines() 按照行分割，返回一个包含各种作为元素的列表
my_str = &quot;i \nam a\n student&quot;
print(my_str.splitlines())

rjust()  返回一个原字符串右对齐，并使用空格填充长度  width的新字符串
ljust()  返回一个原字符串左对齐，并使用空格填充长度  width的新字符串

join 表示添加
my_str = &quot;——&quot;
list = [&quot;my&quot;,&quot;name&quot;,&quot;is&quot;,&quot;laowang&quot;]
ret = my_str.join(list)
print(ret)
</code></pre>
          </section>
      </p>
      
    </section>
    <footer class="post-meta">
        
            <img class="author-thumb" src="/my_technology/images/user.png" alt="Author image" nopin="nopin" />
        
        
            付佳康
        
        
        <time class="post-date" datetime="2020-06-17T22:37:25&#43;08:00">
            17 Jun 2020
        </time>
    </footer>
</article>

    
        
<article class="post ">
    <header class="post-header">
        <h2 class="post-title"><a href="/my_technology/14/">linux配置JDK、MySql、Tomcat</a></h2>
    </header>
    <section class="post-excerpt">
      <p>
          <section class="post-content">
            <pre><code>Linux解压tar包的命令  
    tar -xvf  需要解压的报名 -x代表解压 v代表解压过程 f代表解压的文件
    tar -cvf 将哪些文件进行打包  打包成.tar压缩包
Linux安装wget软件包的命令 
    运行命令：yum -y install wget

Linux配置JDK：
    1.cd usr 在usr中创建jdk文件夹命令：mkdir jdk
    2.进入jdk文件夹命令：cd jdk
    3.下载jdk版本命令：wget下载  jdk下载地址：http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm 
        wget --no-check-certificate --no-cookies --header &quot;Cookie: oraclelicense=accept-securebackup-cookie&quot; http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm 
    4.下载之后可以使用ls命令查看，进行添加执行权限命令：chmod +x jdk-8u131-linux-x64.rpm (下载的jdk名)
    5.执行rpm进行安装，命令：rpm -ivh jdk-8u131-linux-x64.rpm (下载的jdk名)
    6.查看JDK是否安装成功，命令：java -version  
    7.查看JDK的安装路径（一般为/usr/java/jdk-8u131/）
    8.在etc下的profile中进行编辑，命令：vim profile
        添加：
            export JAVA_HOME=/usr/java/jdk1.8.0_131
            export JRE_HOME=${JAVA_HOME}/jre
            export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
            export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
            export PATH=$PATH:${JAVA_PATH}
        点击Esc 输入命令：wq保存退出
    9.加载并更新配置文件，命令：source profile
    10.使用 java -version   javac验证 若可用，表示配置成功
    
Linux配置MySql：
    1.cd usr 在usr中创建mysql文件夹，命令：mkdir mysql
    2.进入mysql文件夹，命令：cd mysql
    3.下载mysql版本命令：wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
    4.下载之后可以使用ls命令查看，进行添加执行权限命令：chmod +x mysql-community-release-el7-5.noarch.rpm
    5.执行rpm进行安装，命令：rpm -ivh mysql-community-release-el7-5.noarch.rpm 
    6.安装mysql服务端,命令：yum install mysql-community-server 也可下载到指定目录下：yum install mysql-community-server -y --downloaddir=/usr/local/src
    7.确保安装成功后重启mysql服务，命令：service mysqld restart
    8.进入mysql数据库，命令：mysql -u root，第一次登陆没有密码，如果想添加密码，继续执行mysql -u root -p密码
 
Linux配置Tomcat：
    1.cd usr 在usr中创建Tomcat文件夹，命令：mkdir tomcat
    2.进入tomcat文件夹，命令：cd tomcat
    3.下载tomcat的zip压缩包，命令：wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.36/bin/apache-tomcat-9.0.36.zip
    4.下载之后可以使用ls命令查看，进行添加执行权限命令：chmod +x apache-tomcat-9.0.36.zip
    5.下载unzip，命令：yum install unzip
    6.再解压zip压缩包,生成apache-tomcat-9.0.36，命令: unzip apache-tomcat-9.0.36.zip
    7.使用递归的方式，将所有文件设上权限，命令：chmod a+x -R *
    8.cd apache-tomcat-9.0.36 确保都可以使用
    9.cd进入conf中，编辑server.xml可以根据需求编辑端口号，命令：vi server.xml  点击i进行更改
    10.返回进入bin目录,启动tomcat，Windows是startup.bat,Linux是startup.sh，命令：sh startup.sh
    11.关闭tomcat，Windows是shutdown.bat,Linux是shutdown.sh，命令：sh shutdown.sh
    12.bin目录下的webapps用来将测试的编译好的web项目放入，移动端项目不需要，再去启动tomcat时会自动找到相应项目
    
    
</code></pre>
          </section>
      </p>
      
    </section>
    <footer class="post-meta">
        
            <img class="author-thumb" src="/my_technology/images/user.png" alt="Author image" nopin="nopin" />
        
        
            付佳康
        
        
        <time class="post-date" datetime="2020-06-16T19:59:48&#43;08:00">
            16 Jun 2020
        </time>
    </footer>
</article>

    
        
<article class="post ">
    <header class="post-header">
        <h2 class="post-title"><a href="/my_technology/13/">Linux介绍与指令</a></h2>
    </header>
    <section class="post-excerpt">
      <p>
          <section class="post-content">
            <pre><code>1.操纵系统有哪些：
    WINDOW  Linux   MAC   麒麟  DOS

2. Linux的简介:
    Linux是一个基于POSIX和unix的多用户 多任务  支持多线程和 多cpu的一个操作系统
    Linux的发行版：
        Ubuntu RedHat  CentOS  Debian  SUse    。。。。

3.Linux的使用领域：
    LNMP   Linux+Nginx+mysql+Php
    LAMP   Linux+apache+mysql+Php
    
    测试中什么时候使用linux？      
        1.搭建测试环境（JDK  MYSQL TOMACT（容器）  NGINX）   
        2.使用linux对服务器的简单的维护()
        3.使用Linux查看日志定位bug
    
    测试中什么时候使用mysql?    
        参数  
        获取session  
        token   
        多表联查(3张表的联查)

4.Linux的安装：
    1.在虚拟机中进行安装linux   
    2.使用云服务的linux  （阿里云 腾讯云）

5.Linux的启动方式：  
    1.命令行登录  ssh root@公有ip
    2.图形界面登录  putt 

6.常用命令：
    Ls / : 展示当前目录下的所有文件
    常用文件夹：
        Etc : 用来存放配置文件和子目录
        Var : 存放日志以及线程程序
        Bin /user/sbin  : 都是系统用户使用的命令
    
    对文件的基本操作命令:
        Cd .. 进入上一曾目录
        Cd ../ 进入根目录
        Cd bin  进入bin目录下  bin可以更换为任意的文件夹  进入指定文件夹
        Ls 展示所有的文件下的子文件夹和子文件
        Ls -l 文件名 显示文件的属性以及文件所属的用户和组

    L  rwx  rwx rwx 对应下标 0  123  456 789
        下标为0的时候代表的是，确定文件类型选哪个
        下标为123 确定文件的所属，拥有该文件的权限
        下标为456 确定属性组，所有有权限的用户组
        下标789  其他用户，拥有该文件的权限
        
    下标为0 有的字母为 d - l b c 
        D 是一个目录  
        - 是一个文件 
        l 链接文档 
        b 装置文件
        c 穿行端口设备
    
    后面3位制（rwx对应123等）
        R 读
        W 写
        X 执行
        - 权限

    屏幕清空 clear 

    更改文件的属性
        chgrp   更改文件的属组
        Mkdir -p 文件名/文件名2  创建文件夹 加-p代表多个 文件名里有个文件夹2
        rmdir 文件名   删除文件夹 加-p选择多个

        Cd.. 上一级目录
        Cd../ 根目录
        Cd~ 根目录

    Cp -r /来源文件 /复制到地址文件  将哪个文件复制到哪个文件里去
    Pwd 显示目前的目录
    Rm 删除文件或者是目录   -f - i -r   忽略不存在的文件   互动模式  递归删除 
    Mv 移动文件或者是目录   -f - i -u   文件已经存在直接覆盖  询问是否覆盖  文件升级

    Vi 文件名 编辑文件
    I  insert输入
    ：wq： 退出编辑 

    文件查看内容
        Cat 由第一行显示内容  
        Cat -a  -b(显示行号)  -e   -n（显示行号 空行也占一行）  -v显示特殊字符的
        Tail  查看文件的后面几行
        -n  -f    
        Less 文件名
        f  下一页
        回车  换行
        Q 推出

    添加用户账号   useradd  
    Useradd  **  用户名
        **  -g  用户组
        -u  用户号
        -d 指定用户住目录
        -s  shell文件  指定用户登录shell



    Linux的磁盘分区的 fdisk
        查看的 df  du
        格式化盘符  mkfs


    Vi 进行编辑  命令模式  command mode  
         输入模式  insert mode
         底线模式  LastLine mode


    使用shell脚本的方式
        1.在Linux下进行创建文件  后缀名位 .sh
        2.编辑创建的好的文件
        3.Chmod +x /文件路径
        4.执行编译的命令
</code></pre>
          </section>
      </p>
      
    </section>
    <footer class="post-meta">
        
            <img class="author-thumb" src="/my_technology/images/user.png" alt="Author image" nopin="nopin" />
        
        
            付佳康
        
        
        <time class="post-date" datetime="2020-06-15T21:00:10&#43;08:00">
            15 Jun 2020
        </time>
    </footer>
</article>

    
        
<article class="post ">
    <header class="post-header">
        <h2 class="post-title"><a href="/my_technology/12/">Jmeter对数据库的增删改查</a></h2>
    </header>
    <section class="post-excerpt">
      <p>
          <section class="post-content">
            <pre><code>1.准备mysql-connector-java-5.1.18-bin.jar（mysql架包）
2.在测试计划中添加数据库jar包
</code></pre><p><img src="../%E6%B7%BB%E5%8A%A0%E6%95%B0%E6%8D%AE%E5%BA%93%E6%9E%B6%E5%8C%85.png" alt="添加数据库架包"></p>
<pre><code>在线程组添加配置原件中的 JDBC Connection Configuration 并进行配置
    Database URL：jdbc:mysql://数据库连接:端口号/库名?characterEncoding=utf-8&amp;allowMultiQueries=true
        库名后添加：?characterEncoding=utf-8&amp;allowMultiQueries=true  表示防止乱码和允许多条sql语句执行
</code></pre><p><img src="../JDBC_Con%E6%93%8D%E4%BD%9C.png" alt="JDBC_Con操作"></p>
<pre><code>在线程住添加取样器中的 JDBC Request,在这里进行增删改查操作
</code></pre><p><img src="../JDBC%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5.png" alt="JDBC增删改查">
<img src="../JDBC%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A51.png" alt="JDBC增删改查"></p>
<pre><code>若系统中有禅道，需要在此电脑管理-》服务》关闭mysqlzt
    否则报错Response message:java.sql.SQLException: Cannot create PoolableConnectionFactory (Access denied for user 'root'@'localhost' (using password: YES))

在线程住添加监听器中的察看结果树，察看进行的增删改查操作（响应数据）
</code></pre><pre><code>对sql语句使用的变量概念：
    在线程组下添加配置原件中的用户定义的变量
        在JDBC Request中如果写入sql语句 select * from teacher where number=${number};
        在用户定义的变量名称要与${}中的变量名一致，值自己定义
</code></pre><pre><code>Statement(状态通道)和 PreparedStatement(预状态通道):
    区别：
        在对数据库只执行一次性存储的时候，用Statement(状态通道)，Statement(状态通道)每次执行sql语句，相关数据库都要执行sql语句的编译
        PreparedStatement(预状态通道)对于批量处理可以大大提高效率，也叫JDBC存储过程，对象的开销比Statement(状态通道)大
</code></pre><p><img src="../%E9%A2%84%E7%8A%B6%E6%80%81%E9%80%9A%E9%81%93.png" alt="预状态通道"></p>
<pre><code>使用PreparedStatement(预状态通道)用英文问号?来进行占位，多个?对应多个值
</code></pre><p><img src="../%E9%A2%84%E7%8A%B6%E6%80%81%E5%8D%A0%E4%BD%8D.png" alt="预状态占位"></p>
<pre><code>使用用户变量进行PreparedStatement(预状态通道):
    在Paramenter Values中用${变量名}要与用户定义的变量中定义的名称一致，变量名不能相同，可以放具体常量值也可以放变量
</code></pre><p><img src="../%E9%A2%84%E7%8A%B6%E6%80%81%E5%8F%98%E9%87%8F.png" alt="预状态变量"></p>
<pre><code>使用Variable names(返回结果) 和 Result variable name（创建一个变量存储返回的结果）与不使用在Debug sampler(调试取样器)中的区别
</code></pre><p><img src="../%E4%BD%BF%E7%94%A8%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C.png" alt="使用返回结果">
<img src="../%E4%BD%BF%E7%94%A8%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C%E7%AD%89.png" alt="使用返回结果等"></p>
<p><img src="../%E4%B8%8D%E4%BD%BF%E7%94%A8%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C.png" alt="不使用返回结果">
<img src="../%E4%B8%8D%E4%BD%BF%E7%94%A8%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C%E7%AD%89.png" alt="不使用返回结果等"></p>

          </section>
      </p>
      
    </section>
    <footer class="post-meta">
        
            <img class="author-thumb" src="/my_technology/images/user.png" alt="Author image" nopin="nopin" />
        
        
            付佳康
        
        
        <time class="post-date" datetime="2020-06-11T20:20:42&#43;08:00">
            11 Jun 2020
        </time>
    </footer>
</article>

    
        
<article class="post ">
    <header class="post-header">
        <h2 class="post-title"><a href="/my_technology/11/">Jmeter简易操作理解</a></h2>
    </header>
    <section class="post-excerpt">
      <p>
          <section class="post-content">
            <pre><code>一：Jmeter对接口测试，主要看接口是否能跑通
    接口测试之线程组：
        我们可以理解为多少个用户，在多长时间完成，多次发送请求
        三者关系：算法是线程数乘与循环数在多长时间内完成

    线程组内http请求：
        举例：https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=
        协议对应：https  
        服务器域名Ip对应：tcc.taobao.com
        端口号与协议对应
        Http请求要对应需求选择get、post等
        路径对应：/cc/json/mobile_tel_segment.htm，必须加斜杠
        内容编码为utf-8防止乱码
        参数对应tel的值

        线程组内察看结果树：
            启动后我们可以在结果树察看取样器、请求、相应数据

二：Jmeter的参数化关联的使用，可以进行单个数据检测和批量数据检测
    第一种用户变量的方式：
        在同请求一起发送参数中，添加参数值,如果使用${}代替值，需要关联到用户定义的变量名称与${}内的相同

    第二种方法为批量数据csv文件，模拟多个用户
        线程数要根据用户的多少进行修改，在配置找到csv数据文件设置，配置好写好的文件，文件编码utf-8防止乱码，变量名名称与http请求中的参数值相同，多个参数名称以逗号隔开

三：断言，简单说就是判断http请求成功没有
	在断言中添加响应断言，可以选择不同的测试字段和匹配规则来测试，在测试模式中添加要找的数据，然后在监听器中添加断言结果，察看是否有要找寻的数据，如果没有会进行提示失败，如果有显示接口名称

四：Jmeter性能测试
	可以通过聚合报告，图形结果，表格察看结果，和汇总图，汇总图包含了聚合报告等，首先增加线程数来测试性能指标
	常见的性能测试的指标有：
        一：系统指标（用户场景和需求相关指标）	
            响应时间，258原则（2秒优秀，5秒一般，8秒以上直接放弃）
            并发用户数， 
            吞吐率，吞吐量， 
            TPS，每秒事务数，
            点击率
        二：资源使用率（与硬件资源消耗相关指标）
            CPU使用率  不得超过75%
            内存使用率  不得超过80%
            磁盘吞吐率  不得超过70%
            网络吞吐率  不得超过80%
		

五：jmeter的定时器，负责定义请求之间的延迟间隔，模拟对服务器的连续请求
	固定定时器（1秒=1000毫秒）是在请求之前停留定义的时间后再发送请求
	逻辑控制器中的循环控制器，在里面添加循环次数，之后将固定定时器放在循环控制器下，每发送一次请求都需要等待


六：Jmeter后置配置器获取Token值：
    1.在线程组中添加HTTP请求默认值，将协议与服务器IP地址写入，使用一次后将默认请求接口，方便同一接口下的验证
    
    2.添加HTTP请求，因添加过HTTP请求默认值，我们可以不写协议与服务器IP，只修改请求、路径等，我们根据需求文档使用消息体数据{&quot;userName&quot;:&quot;值&quot;,&quot;password&quot;:&quot;值&quot;}的方式传参
        1.需求文档有请求头，我们在HTTP请求中添加配置原件中的HTTP信息头管理器，根据需求文档写入名称与值
        2.我们要获取token，所以在HTTP请求中添加后置处理器中的正则表达式提取器，需要在引用名称定义参变量名（如token），正则表达式我们用&quot;token&quot;:&quot;(.*?)&quot;,，模板代表我们请求的值有几个（如只有一个用$1$代替）
    
    3.我们另外添加一个HTTP请求，将请求、路径、消息体数据按需求文档写入
        1.需求文档有请求头，我们在HTTP请求中添加配置原件中的HTTP信息头管理器，根据需求文档写入名称与值
        2.需求文档要求有获取的token，同样我们写入名称，值用${变量名}来写入，变量名要与上一个请求中的正则表达式提取器定义的引用名称相同
    
    4.添加察看结果树，察看获取到的响应数据，
    
    5.添加取样器中的Debug sampler(调试取样器)
</code></pre>
          </section>
      </p>
      
    </section>
    <footer class="post-meta">
        
            <img class="author-thumb" src="/my_technology/images/user.png" alt="Author image" nopin="nopin" />
        
        
            付佳康
        
        
        <time class="post-date" datetime="2020-06-10T15:22:06&#43;08:00">
            10 Jun 2020
        </time>
    </footer>
</article>

    
        
<article class="post ">
    <header class="post-header">
        <h2 class="post-title"><a href="/my_technology/10/">Jmeter</a></h2>
    </header>
    <section class="post-excerpt">
      <p>
          <section class="post-content">
            <pre><code>在测试计划下，添加线程组：
    线程住作用如下
</code></pre><p><img src="../%E7%BA%BF%E7%A8%8B%E7%BB%84.png" alt="线程组"></p>
<pre><code>在线程组下取样器中，添加http请求：
    http请求作用如下
</code></pre><p><img src="../http%E8%AF%B7%E6%B1%82.png" alt="http请求"></p>
<pre><code>在线程组下监听器中，添加察看结果树：
    察看结果树作用如下
</code></pre><p><img src="../%E5%AF%9F%E7%9C%8B%E7%BB%93%E6%9E%9C%E6%A0%91.png" alt="察看结果树"></p>
<pre><code>在线程组下监听器中，添加聚合报告：
    汇总报告作用如下
</code></pre><p><img src="../%E8%81%9A%E5%90%88%E6%8A%A5%E5%91%8A.png" alt="聚合报告"></p>
<pre><code>在线程组下监听器中，添加汇总图：
    汇总图作用如下
</code></pre><p><img src="../%E6%B1%87%E6%80%BB%E5%9B%BE.png" alt="汇总图"></p>
<pre><code>在线程组下监听器中，添加图形结果：
    图形结果作用如下
</code></pre><p><img src="../%E5%9B%BE%E5%BD%A2%E7%BB%93%E6%9E%9C.png" alt="图形结果"></p>
<pre><code>在线程组下监听器中，添加用表格查看结果：
    用表格查看结果作用如下
</code></pre><p><img src="../%E8%A1%A8%E6%A0%BC%E6%9F%A5%E7%9C%8B%E7%BB%93%E6%9E%9C.png" alt="表格查看结果"></p>
<pre><code>在线程组下断言中，添加响应断言：
    响应断言作用如下
</code></pre><p><img src="../%E5%93%8D%E5%BA%94%E6%96%AD%E8%A8%80.png" alt="响应断言"></p>
<pre><code>在线程组下监听器中，添加断言结果：
    断言结果作用如下
</code></pre><p><img src="../%E6%96%AD%E8%A8%80%E7%BB%93%E6%9E%9C.png" alt="断言结果"></p>
<pre><code>参数化关联：
    动态获取的叫参数化，批量操作如下（也可以使用函数助手）：
        新建csv.txt文本或 ***.csv docx表格两种格式
        多个值用逗号隔开，如下图
        在线程组下配置元件中添加 csv data set config并设置，如下图
        最后将线程组中的线程数修改为与csv.txt中数量一致，点击运行，察看结果树会将不同参数进行http请求得到相应数据
    
</code></pre><p><img src="../csv%E6%96%87%E6%9C%AC.png" alt="csv文本">
<img src="../csvdata.png" alt="csvdata"></p>

          </section>
      </p>
      
    </section>
    <footer class="post-meta">
        
            <img class="author-thumb" src="/my_technology/images/user.png" alt="Author image" nopin="nopin" />
        
        
            付佳康
        
        
        <time class="post-date" datetime="2020-06-09T20:29:30&#43;08:00">
            9 Jun 2020
        </time>
    </footer>
</article>

    
        
<article class="post ">
    <header class="post-header">
        <h2 class="post-title"><a href="/my_technology/09/">Charles功能</a></h2>
    </header>
    <section class="post-excerpt">
      <p>
          <section class="post-content">
            <pre><code>1.抓取http和https网络封包（抓包）
</code></pre><pre><code>2.Charles断点请求
    设置断点流程：
        1.右键点击要进行断点操作的地址，点击Breakpoints
        2.在Proxy（代理）中点击Breakpoints Settings可进行设置
</code></pre><p><img src="../%E6%96%AD%E7%82%B9.png" alt="断点"></p>
<pre><code>3.支持和重发网络请求：
    重复网络请求的目的：
        后台调试过程中，一直在客户端实现点点点过于麻烦
        直接使用charles的重发网络的方式可以直接多次调用接口发送请求，方便查询结果
        重发网络的方式：
            1.右键点击连接，点击repeat 的方式进行单次的网络请求
            1.右键点击连接，点击Repeat Advanced 或 在Tools下点击Advanced Repeat进入下图定义，进行多次网络请求
</code></pre><p><img src="../%E5%8F%91%E9%80%81%E8%AF%B7%E6%B1%82.png" alt="请求次数"></p>
<pre><code>4.支持修改网络参数
    1.先进行断点操作
    2.如下图
</code></pre><p><img src="../%E4%BF%AE%E6%94%B9%E8%AF%B7%E6%B1%82%E7%BD%91%E7%BB%9C%E5%8F%82%E6%95%B0.png" alt="修改请求网络参数"></p>
<pre><code>5.支持网络请求并修改参数值
    1.先进行断点操作
    2.刷新进入
    2.如下图
</code></pre><p><img src="../%E4%BF%AE%E6%94%B9%E8%AF%B7%E6%B1%82.png" alt="修改网络请求">
<img src="../%E4%BF%AE%E6%94%B9%E5%8F%82%E6%95%B0%E5%80%BC.png" alt="修改参数值"></p>
<pre><code>6.支持弱网测试：
    网络： 5G、 4G、 3G、 公共网络
    网络延迟情况，对web/app操作有一定的影响
    数据包从用户的客户端发送到服务器等后，在服务器反馈到客户端的时间就是网络延迟
    用来测试网络管理的工具  PING
    
    在代理（proxy）里找 Throttle Settings设置如下图：
</code></pre><p><img src="../%E5%BC%B1%E7%BD%91%E6%B5%8B%E8%AF%95.png" alt="弱网测试">
<img src="../%E5%BC%B1%E7%BD%91%E6%B5%8B%E8%AF%952.png" alt="弱网测试"></p>

          </section>
      </p>
      
    </section>
    <footer class="post-meta">
        
            <img class="author-thumb" src="/my_technology/images/user.png" alt="Author image" nopin="nopin" />
        
        
            付佳康
        
        
        <time class="post-date" datetime="2020-06-08T20:26:45&#43;08:00">
            8 Jun 2020
        </time>
    </footer>
</article>

    

    <nav class="pagination" role="navigation">
	
	<span class="page-number">Page 1 of 3</span>
	
	    <a class="older-posts" href="/my_technology/page/2/">Older Posts &rarr;</a>
	
</nav>


</main>

    <footer class="site-footer clearfix">
        <section class="copyright"><a href="">我的博客</a> </section>
        
        <section class="poweredby">Proudly generated by <a class="icon-hugo" href="https://gohugo.io">HUGO</a>, with <a class="icon-theme" href="https://github.com/syui/hugo-theme-air">hugo-theme-air</a> theme</section>
        
    </footer>
    </div>
    <script type="text/javascript" src="/my_technology/js/jquery.js"></script>
    <script type="text/javascript" src="/my_technology/js/jquery.fitvids.js"></script>
    <script type="text/javascript" src="/my_technology/js/index.js"></script>
    <script src="/my_technology/js/particles.min.js"></script>
    <script src="/my_technology/js/particles.js"></script>  

</body>
</html>

